package com.ldcc.springcomponentdemo.spring_integration.channel_adapter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.InboundChannelAdapter;
import org.springframework.integration.annotation.Poller;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.file.FileReadingMessageSource;
import org.springframework.integration.file.filters.AcceptOnceFileListFilter;
import org.springframework.integration.file.filters.SimplePatternFileListFilter;
import org.springframework.messaging.MessageChannel;

import java.io.File;

/**
 * 通道适配器（Channel Adapter） 是 Spring Integration 中的桥梁，用于把“外部世界”与“消息通道”对接起来。
 *
 * 按方向划分：
 * 类型	作用说明
 * 📥 Inbound Adapter	外部 → Spring：接收外部输入，发到通道
 * 📤 Outbound Adapter	Spring → 外部：监听通道并发送到外部
 *
 * 本节目标：文件入站适配器（File Inbound Adapter）
 * 我们会构建一个自动监听本地目录的例子，每隔 2 秒轮询一次：
 *
 * ✅ 检查 input-dir 文件夹有没有新文件
 * ✅ 把文件路径作为 Message 发到通道
 * ✅ 使用 @ServiceActivator 消费并打印文件名
 */
@SpringBootApplication
@EnableIntegration
public class SpringIntegrationChannelAdapterDemoApplication {

    /**
     * 文件输入目录
     */
    private static final String INPUT_DIR = "D:\\workspace\\spring-component-demp\\src\\main\\java\\com\\ldcc\\springcomponentdemo\\spring_integration\\channel_adapter\\input_dir";

    public static void main(String[] args) {
        SpringApplication.run(SpringIntegrationChannelAdapterDemoApplication.class, args);
    }

    /**
     * 定义输出通道（文件消息会发到这个通道）
     */
    @Bean
    public MessageChannel fileInputChannel() {
        return new DirectChannel();
    }

    /**
     * 文件读取器（MessageSource），带文件过滤器：
     * - 只读取 .txt 文件
     * - 同一个文件只读取一次
     */
    @Bean
    public FileReadingMessageSource fileReader() {
        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setDirectory(new File(INPUT_DIR));
        source.setFilter(new org.springframework.integration.file.filters.CompositeFileListFilter<>(
                java.util.List.of(
                        new SimplePatternFileListFilter("*.txt"),       // 只处理 .txt 文件
                        new AcceptOnceFileListFilter<>()                // 每个文件只处理一次
                )
        ));
        return source;
    }

    /**
     * 配置文件入站适配器：每 2 秒轮询一次 input-dir，向 fileInputChannel 发送文件消息
     */
    @Bean
    @InboundChannelAdapter(channel = "fileInputChannel", poller = @Poller(fixedRate = "2000"))
    public FileReadingMessageSource fileInboundAdapter() {
        return fileReader();
    }

    /**
     * 消费文件消息
     */
    @ServiceActivator(inputChannel = "fileInputChannel")
    public void handleFile(java.io.File file) {
        System.out.println("📂 发现新文件: " + file.getAbsolutePath());
    }

}
